/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ufs.dcomp.mgemeos.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import ufs.dcomp.mgemeos.negocio.Atividade;
//import ufs.dcomp.mgemeos.utils.Utils;

/**
 *
 * @author Luiz
 * 
 */
public class AtividadeDAO implements interface_dao.IAtividade{

    private static String inserir = "insert into atividade (inicio, termino, conteudo, concluida, idOrganizador) values (?,?,?,?,?)";
    private static String atualizar = "update atividade set inicio =?, termino=?, conteudo=?, idOrganizador=? where idAtividade=?";
    private static String atualizar_status = "update atividade set concluida=? where idAtividade=? and idOrganizador=?";
    private static String obter_atividade_organizador = "select * from atividade where idOrganizador = ? ORDER BY termino ASC";
    private static String obter = "select * from atividade where idAtividade = ? ";
    private static String obter_todos = "select * from atividade";
    private static String delete = "delete from atividade where idAtividade = ? ";


    @Override
    public boolean atualizarAtividade(Atividade atividade) {
        Conexao conexao = new Conexao();
        Connection con = conexao.getConnection();
        PreparedStatement pst;
        
        try {
            pst = con.prepareStatement(atualizar);
            try {
                pst.setDate(1, HorarioDAO.formataData(atividade.getInicio()));                
            } catch (Exception ex) {
                Logger.getLogger(AtividadeDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                pst.setDate(2, HorarioDAO.formataData(atividade.getTermino()));
            } catch (Exception ex) {
                Logger.getLogger(AtividadeDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
            pst.setString(3, atividade.getConteudo());
            pst.setInt(4, atividade.getIdOrganizador());
            pst.setInt(5, atividade.getIdAtividade());
            pst.executeUpdate();
            pst.close();
            con.close();
            return true;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    public boolean atualizarStatus(int idOrganizador, int idAtividade, boolean status) {
        Connection con = new Conexao().getConnection();
        PreparedStatement pst;
        try {
            pst = con.prepareStatement(atualizar_status);

            pst.setBoolean(1, status);
            pst.setInt(2, idAtividade);
            pst.setInt(3, idOrganizador);
            pst.executeUpdate();
            pst.close();
            con.close();
            return true;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    public Atividade obterAtividade(int id) {
        Atividade atividade = null;
        Connection con = new Conexao().getConnection();
        PreparedStatement pst;
        try {
            pst = con.prepareStatement(obter);
            pst.setInt(1, id);
            ResultSet rs = pst.executeQuery();
            if (rs.next()) {

                atividade = new Atividade();
                atividade.setIdAtividade(rs.getInt(1));
                atividade.setInicio(rs.getDate(2).toString());
                atividade.setTermino(rs.getDate(3).toString());
                atividade.setConteudo(rs.getString(4));
                atividade.setConcluida(rs.getBoolean(5));
                atividade.setIdOrganizador(rs.getInt(6));

            }
            rs.close();
            pst.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return atividade;
    }

    public boolean inserirAtividade(Atividade atividade) {

        Connection con = new Conexao().getConnection();
        PreparedStatement pst;

        Atividade atividade2 = obterAtividade(atividade.getIdAtividade());

        if (atividade2 == null) {
            try {
                pst = con.prepareStatement(inserir);
                try {
                    pst.setDate(1, HorarioDAO.formataData(atividade.getInicio()));
                } catch (Exception ex) {
                    Logger.getLogger(AtividadeDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    pst.setDate(2, HorarioDAO.formataData(atividade.getTermino()));
                } catch (Exception ex) {
                    Logger.getLogger(AtividadeDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
                pst.setString(3, atividade.getConteudo());
                pst.setBoolean(4, false);//O status inicial da atividade é sempre falso.
                pst.setInt(5, atividade.getIdOrganizador());
                pst.execute();
                pst.close();
                con.close();
                return true;
            } catch (SQLException e) {
                e.printStackTrace();
                return false;
            }
        } else {
            return false;
        }
    }

    public boolean deletarAtividade(int id) {

        Connection con = new Conexao().getConnection();
        PreparedStatement pst;

        Atividade atividade2 = obterAtividade(id);

        if (atividade2 != null) {
            try {
                pst = con.prepareStatement(delete);
                pst.setInt(1, id);
                pst.execute();
                pst.close();
                con.close();
                return true;
            } catch (SQLException e) {
                e.printStackTrace();
                return false;
            }
        } else {
            return false;
        }
    }

    public ArrayList<Atividade> obter_Atividades_Organizador(int id) {

        Atividade atividade = null;
        ArrayList<Atividade> atividades = new ArrayList<Atividade>();
        Connection con = new Conexao().getConnection();
        PreparedStatement pst;
        try {
            pst = con.prepareStatement(obter_atividade_organizador);
            pst.setInt(1, id);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {

                atividade = new Atividade();
                atividade.setIdAtividade(rs.getInt(1));
                atividade.setInicio(rs.getDate(2).toString());
                atividade.setTermino(rs.getDate(3).toString());
                atividade.setConteudo(rs.getString(4));
                atividade.setConcluida(rs.getBoolean(5));
                atividade.setIdOrganizador(rs.getInt(6));
                atividades.add(atividade);
            }
            rs.close();
            pst.close();
            con.close();
        } catch (SQLException e) {
            System.err.println("Erro ao obter as atividades de um organizador \n" + e.getMessage());
            e.getErrorCode();
        }
        return atividades;
    }

    /*public static void main(String[] args) {
        Atividade a = new Atividade();
        a.setConcluida(false);
        a.setConteudo("sdasdsd");
        a.setIdOrganizador(2);
        a.setInicio("14/04/2011");
        a.setTermino("16/04/2011");
        inserirAtividade(a);
    }*/
}
